package datastructures.tree;

import java.util.Objects;

/**
 * 二叉树
 *
 * @author hck
 */
public class BinaryTree<T> {

    private Node root;

    public void setRoot(Node root) {
        this.root = root;
    }

    public void preorderTraverse() {
        if (Objects.isNull(root)) {
            return;
        }
        preOrderTraverse(this.root);
    }

    public void inOrderTraversal() {
        if (Objects.isNull(root)) {
            return;
        }
        inOrderTraversal(this.root);
    }

    public void postOrderTraverse() {
        if (Objects.isNull(root)) {
            return;
        }
        postOrderTraversal(this.root);
    }

    /**
     * 前序遍历
     */
    private void preOrderTraverse(Node node) {
        System.out.print(node + " ");
        if (Objects.nonNull(node.left)) {
            preOrderTraverse(node.left);
        }
        if (Objects.nonNull(node.right)) {
            preOrderTraverse(node.right);
        }
    }

    /**
     * 中序遍历
     */
    private void inOrderTraversal(Node node) {
        if (Objects.nonNull(node.left)) {
            inOrderTraversal(node.left);
        }
        System.out.print(node + " ");
        if (Objects.nonNull(node.right)) {
            inOrderTraversal(node.right);
        }
    }

    /**
     * 后序遍历
     */
    private void postOrderTraversal(Node node) {
        if (Objects.nonNull(node.left)) {
            postOrderTraversal(node.left);
        }
        if (Objects.nonNull(node.right)) {
            postOrderTraversal(node.right);
        }
        System.out.print(node + " ");
    }

    /**
     * 前序遍历
     */
    private void preorderTraverse(Node node) {
        System.out.print(node + " ");
        if (Objects.nonNull(node.left)) {
            preorderTraverse(node.left);
        }
        if (Objects.nonNull(node.right)) {
            preorderTraverse(node.right);
        }
    }


    /**
     * 二叉树的节点
     */
    static class Node {
        Object data;
        Node left;
        Node right;

        Node(Object data) {
            this.data = data;
        }

        @Override
        public String toString() {
            return data.toString();
        }
    }
}


